#!/usr/bin/env node

/**
 * 小红猫DPS统计工具 - 图标设置脚本
 * 专门用于为已生成的exe文件设置图标
 */

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

class IconSetter {
    constructor() {
        this.projectDir = __dirname;
        this.iconPath = path.join(this.projectDir, 'redcat.ico');
        this.distDir = path.join(this.projectDir, 'dist');
    }

    log(message) {
        console.log(`[ICON] ${message}`);
    }

    async setIconForExe(exePath) {
        this.log(`正在为 ${path.basename(exePath)} 设置图标...`);
        
        if (!fs.existsSync(this.iconPath)) {
            this.log('❌ 错误：找不到 redcat.ico 文件');
            return false;
        }

        // 创建备份
        const backupPath = exePath + '.backup';
        try {
            fs.copyFileSync(exePath, backupPath);
            this.log('✅ 已创建exe备份文件');
        } catch (err) {
            this.log(`❌ 创建备份失败: ${err.message}`);
            return false;
        }

        let success = false;

        // 方法1: 使用本地 rcedit
        try {
            const localRcedit = path.join(this.projectDir, 'node_modules', '.bin', 'rcedit.exe');
            if (fs.existsSync(localRcedit)) {
                this.log('尝试使用本地 rcedit...');
                execSync(`"${localRcedit}" "${exePath}" --set-icon "${this.iconPath}"`, { 
                    stdio: 'inherit',
                    timeout: 30000
                });
                
                // 验证exe是否还能正常运行
                try {
                    execSync(`"${exePath}" --version`, { timeout: 5000, stdio: 'pipe' });
                    success = true;
                    this.log('✅ 图标设置成功 (本地rcedit)');
                } catch (testErr) {
                    this.log('⚠️ 图标设置后exe验证失败，恢复备份');
                    fs.copyFileSync(backupPath, exePath);
                }
            }
        } catch (err) {
            this.log(`⚠️ 本地rcedit失败: ${err.message}`);
        }

        // 方法2: 使用全局 rcedit
        if (!success) {
            try {
                this.log('尝试使用全局 rcedit...');
                execSync(`rcedit "${exePath}" --set-icon "${this.iconPath}"`, { 
                    stdio: 'inherit',
                    timeout: 30000
                });
                
                // 验证exe是否还能正常运行
                try {
                    execSync(`"${exePath}" --version`, { timeout: 5000, stdio: 'pipe' });
                    success = true;
                    this.log('✅ 图标设置成功 (全局rcedit)');
                } catch (testErr) {
                    this.log('⚠️ 图标设置后exe验证失败，恢复备份');
                    fs.copyFileSync(backupPath, exePath);
                }
            } catch (err) {
                this.log(`⚠️ 全局rcedit失败: ${err.message}`);
            }
        }

        // 方法3: 使用 npx
        if (!success) {
            try {
                this.log('尝试使用 npx rcedit...');
                execSync(`npx rcedit "${exePath}" --set-icon "${this.iconPath}"`, { 
                    stdio: 'inherit',
                    timeout: 30000
                });
                
                // 验证exe是否还能正常运行
                try {
                    execSync(`"${exePath}" --version`, { timeout: 5000, stdio: 'pipe' });
                    success = true;
                    this.log('✅ 图标设置成功 (npx rcedit)');
                } catch (testErr) {
                    this.log('⚠️ 图标设置后exe验证失败，恢复备份');
                    fs.copyFileSync(backupPath, exePath);
                }
            } catch (err) {
                this.log(`⚠️ npx rcedit失败: ${err.message}`);
            }
        }

        // 清理备份文件
        try {
            if (fs.existsSync(backupPath)) {
                fs.unlinkSync(backupPath);
                this.log('✅ 备份文件已清理');
            }
        } catch (err) {
            this.log(`⚠️ 备份文件清理失败: ${err.message}`);
        }

        if (!success) {
            this.log('❌ 所有图标设置方法都失败');
            this.log('可能的原因：');
            this.log('1. 防病毒软件阻止了文件修改');
            this.log('2. 图标文件格式不正确');
            this.log('3. 需要管理员权限');
            this.log('4. rcedit工具版本不兼容');
        }

        return success;
    }

    async setIconForAllExes() {
        if (!fs.existsSync(this.distDir)) {
            this.log('❌ 错误：找不到 dist 目录');
            return;
        }

        const files = fs.readdirSync(this.distDir);
        const exeFiles = files.filter(file => file.toLowerCase().endsWith('.exe'));

        if (exeFiles.length === 0) {
            this.log('❌ 错误：在 dist 目录中找不到 exe 文件');
            this.log('请先运行构建脚本生成 exe 文件');
            return;
        }

        this.log(`找到 ${exeFiles.length} 个 exe 文件:`);
        exeFiles.forEach(file => this.log(`  - ${file}`));

        this.log('\n开始设置图标...');
        
        for (const exeFile of exeFiles) {
            const exePath = path.join(this.distDir, exeFile);
            await this.setIconForExe(exePath);
            this.log(''); // 空行分隔
        }

        this.log('图标设置完成！');
    }

    async run() {
        try {
            console.log('🔧 小红猫DPS统计工具 - 图标设置工具\n');
            
            // 检查图标文件
            if (!fs.existsSync(this.iconPath)) {
                this.log('❌ 错误：找不到 redcat.ico 文件');
                this.log('请确保 redcat.ico 文件存在于项目根目录');
                return;
            }

            this.log(`✅ 找到图标文件: ${this.iconPath}`);
            
            // 检查是否有命令行参数指定特定文件
            const args = process.argv.slice(2);
            if (args.length > 0) {
                const exePath = args[0];
                if (fs.existsSync(exePath)) {
                    await this.setIconForExe(exePath);
                } else {
                    this.log(`❌ 错误：指定的文件不存在: ${exePath}`);
                }
            } else {
                // 为所有exe文件设置图标
                await this.setIconForAllExes();
            }

        } catch (err) {
            this.log(`❌ 运行失败: ${err.message}`);
        }
    }
}

// 运行图标设置工具
const iconSetter = new IconSetter();
iconSetter.run();
